
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2008, Adam Kubach
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

#include "Minerva/Plugins/OSM/Way.h"

using namespace Minerva::Layers::OSM;


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

Way::Way ( IdType id, const Date& timestamp, const Tags& tags, const Nodes& nodes ) : 
  BaseClass ( id, timestamp, tags ),
  _nodes ( nodes )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Create a way.
//
///////////////////////////////////////////////////////////////////////////////

Way* Way::create ( IdType id, const Date& timestamp, const Tags& tags, const Nodes& nodes )
{
  return new Way ( id, timestamp, tags, nodes );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

Way::~Way()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the number of nodes.
//
///////////////////////////////////////////////////////////////////////////////

unsigned int Way::numNodes() const
{
  return _nodes.size();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the i'th node.
//
///////////////////////////////////////////////////////////////////////////////

Node* Way::node ( unsigned int i ) const
{
  return _nodes.at ( i ).get();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the nodes.
//
///////////////////////////////////////////////////////////////////////////////

const Way::Nodes& Way::nodes() const
{
  return _nodes;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the extents of this way.
//
///////////////////////////////////////////////////////////////////////////////

Way::Extents Way::extents() const
{
  Extents extents;
  
  for ( Nodes::const_iterator iter = _nodes.begin(); iter != _nodes.end(); ++iter )
  {
    Node::RefPtr node ( *iter );
    if ( node.valid() )
    {
      extents.expand ( Extents::Vertex ( node->location()[0], node->location()[1] ) );
    }
  }

  return extents;
}
